<?php
/**
 * 担保支付控制器类
 */
namespace Api\Controller;

use Think\Controller;

class EnsurePayController extends Controller{
    
    public function _initialize(){
        vendor("Alipay.Corefunction");
        vendor("Alipay.Md5function");
        vendor("Alipay.Notify");
        vendor("Alipay.Submit");
    }
    
    /**
     * 该方法其实就是将接口文件包下alipayapi.php的内容复制过来
     * 然后进行相关处理  担保交易接口      
    */
    public function doAlipay(){
       
       //读取支付宝配置参数
       $alipay_config=C('alipay_config');  

        //支付类型 必填，不能修改
        $payment_type = "1";
        
        //服务器异步通知页面路径  需http://格式的完整路径，不能加?id=123这类自定义参数
        $notify_url = U('Api/EnsurePay/notifyurl', "", "", TRUE);
        
        //页面跳转同步通知页面路径 需http://格式的完整路径，不能加?id=123这类自定义参数，不能写成http://localhost/
        $return_url = U('Api/EnsurePay/return_url', "", "", TRUE);

        //卖家支付宝帐户  必填
        $seller_email = C('alipay.seller_email');

        //商户订单号 商户网站订单系统中唯一订单号，必填
        $out_trade_no = $_POST['WIDout_trade_no'];

        //订单名称 必填
        $subject = $_POST['WIDsubject'];

        //付款金额 必填
        $price = $_POST['WIDprice'];

        //商品数量 必填 建议默认为1，不改变值，把一次交易看成是一次下订单而非购买一件商品
        $quantity = "1";
        
        //物流费用 必填
        $logistics_fee = "0.00";
        
        //物流类型 必填 三个值可选：EXPRESS（快递）、POST（平邮）、EMS（EMS）
        $logistics_type = "EXPRESS";
        
        //物流支付方式  必填，两个值可选：SELLER_PAY（卖家承担运费）、BUYER_PAY（买家承担运费）
        $logistics_payment = "SELLER_PAY";
        
        //订单描述
        $body = $_POST['WIDbody'];
        
        //商品展示地址 需以http://开头的完整路径，如：http://www.商户网站.com/myorder.html
        $show_url = $_POST['WIDshow_url'];

        //收货人姓名
        $receive_name = $_POST['WIDreceive_name'];

        //收货人地址  如：XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号
        $receive_address = $_POST['WIDreceive_address'];

        //收货人邮编
        $receive_zip = $_POST['WIDreceive_zip'];

        //收货人电话号码
        $receive_phone = $_POST['WIDreceive_phone'];

        //收货人手机号码
        $receive_mobile = $_POST['WIDreceive_mobile'];


        /************************************************************/

        //构造要请求的参数数组，无需改动
        $parameter = array(
            "service" => "create_partner_trade_by_buyer",
            "partner" => trim($alipay_config['partner']),
            "payment_type"	=> $payment_type,
            "notify_url"	=> $notify_url,
            "return_url"	=> $return_url,
            "seller_email"	=> $seller_email,
            "out_trade_no"	=> $out_trade_no,
            "subject"	=> $subject,
            "price"	=> $price,
            "quantity"	=> $quantity,
            "logistics_fee"	=> $logistics_fee,
            "logistics_type"	=> $logistics_type,
            "logistics_payment"	=> $logistics_payment,
            "body"	=> $body,
            "show_url"	=> $show_url,
            "receive_name"	=> $receive_name,
            "receive_address"	=> $receive_address,
            "receive_zip"	=> $receive_zip,
            "receive_phone"	=> $receive_phone,
            "receive_mobile"	=> $receive_mobile,
            "_input_charset"	=> trim(strtolower($alipay_config['input_charset']))
        );

        //建立请求
        $alipaySubmit = new AlipaySubmit($alipay_config);
        $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
        echo $html_text;
    }
    
    /**
     * 服务器异步通知页面方法 来源notify_url.php
     * 通知对象针对的是卖家，即服务器内部进行处理
     * trade_status:
     *       WAIT_BUYER_PAY         等待买家付款
     *       WAIT_SELLER_SEND_GOODS 买家已付款，等待卖家发货
     *       WAIT_BUYER_CONFIRM_GOODS 卖家已发货，等待买家确认
     *       TRADE_FINISHED         交易成功结束
     *       TRADE_CLOSED           交易中途关闭（已结束，未成功完成）
     */
    function notifyurl(){

        $alipay_config=C('alipay_config');
        //计算得出通知验证结果
        $alipayNotify = new AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyNotify();
        if($verify_result) {
            //验证成功
            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
            $out_trade_no   = $_POST['out_trade_no'];      //商户订单号
            $trade_no       = $_POST['trade_no'];          //支付宝交易号
            $trade_status   = $_POST['trade_status'];      //交易状态
            $total_fee      = $_POST['total_fee'];         //交易金额
            $notify_id      = $_POST['notify_id'];         //通知校验ID。
            $notify_time    = $_POST['notify_time'];       //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。
            $buyer_email    = $_POST['buyer_email'];       //买家支付宝帐号；
            $parameter = array(
             "out_trade_no"  => $out_trade_no,             //商户订单编号；
             "trade_no"      => $trade_no,                 //支付宝交易号；
             "total_fee"     => $total_fee,                //交易金额；
             "trade_status"     => $trade_status,          //交易状态
             "notify_id"     => $notify_id,                //通知校验ID。
             "notify_time"   => $notify_time,              //通知的发送时间。
             "buyer_email"   => $buyer_email,              //买家支付宝帐号；
            );
            if($_POST['trade_status'] == 'WAIT_BUYER_PAY') {
                //该判断表示买家已在支付宝交易管理中产生了交易记录，但没有付款

                        //判断该笔订单是否在商户网站中已经做过处理
                                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                                //如果有做过处理，不执行商户的业务程序

                echo "success";		//请不要修改或删除

                //调试用，写文本函数记录程序运行情况是否正常
                logResult("等待买家付款");
            } else if($_POST['trade_status'] == 'WAIT_SELLER_SEND_GOODS') {
                //该判断表示买家已在支付宝交易管理中产生了交易记录且付款成功，但卖家没有发货

                        //判断该笔订单是否在商户网站中已经做过处理
                                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                                //如果有做过处理，不执行商户的业务程序

                echo "success";		//请不要修改或删除

                //调试用，写文本函数记录程序运行情况是否正常
                logResult("等待卖家发货");
            } else if($_POST['trade_status'] == 'WAIT_BUYER_CONFIRM_GOODS') {
                //该判断表示卖家已经发了货，但买家还没有做确认收货的操作

                        //判断该笔订单是否在商户网站中已经做过处理
                                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                                //如果有做过处理，不执行商户的业务程序

                echo "success";		//请不要修改或删除

                //调试用，写文本函数记录程序运行情况是否正常
                logResult("等待买家确认收货");
            } else if($_POST['trade_status'] == 'TRADE_FINISHED') {
                //该判断表示买家已经确认收货，这笔交易完成

                        //判断该笔订单是否在商户网站中已经做过处理
                                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                                //如果有做过处理，不执行商户的业务程序

                echo "success";		//请不要修改或删除

                //调试用，写文本函数记录程序运行情况是否正常
                logResult("交易完成");
            } else {
                        //其他状态判断
                echo "success";

                //调试用，写文本函数记录程序运行情况是否正常
                //logResult ("这里写入想要调试的代码变量值，或其他运行的结果记录");
            }

                //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

                /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        } else {
            //验证失败
            echo "fail";

            //调试用，写文本函数记录程序运行情况是否正常
            //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
        }    
    }
    
    /**
     * 页面跳转同步通知方法 来源return_url.php
     * 通知对象针对的是买家，根据状态进行页面跳转
     * trade_status:
     *       WAIT_BUYER_PAY         等待买家付款
     *       WAIT_SELLER_SEND_GOODS 买家已付款，等待卖家发货
     *       WAIT_BUYER_CONFIRM_GOODS 卖家已发货，等待买家确认
     *       TRADE_FINISHED         交易成功结束
     *       TRADE_CLOSED           交易中途关闭（已结束，未成功完成）
     */
    public function returnurl(){
        $alipay_config = C('alipay_config');
        $alipayNotify = new AlipayNotify($alipay_config);  //计算得出通知验证结果
        $verify_result = $alipayNotify->verifyReturn();
        if($verify_result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码

            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
            //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表

            //商户订单号
            $out_trade_no = $_GET['out_trade_no'];

            //支付宝交易号
            $trade_no = $_GET['trade_no'];

            //交易状态
            $trade_status = $_GET['trade_status'];

            if($_GET['trade_status'] == 'WAIT_SELLER_SEND_GOODS') {
//                买家已付款，等待卖家发货
               
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //如果有做过处理，不执行商户的业务程序
            } else {
                echo "trade_status=".$_GET['trade_status'];
            }
            echo "验证成功<br />";
            echo "trade_no=".$trade_no;

            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
        } else {
            //验证失败
            //如要调试，请看alipay_notify.php页面的verifyReturn函数
            echo "验证失败";
        }
    }
}